// n皇后问题
#include <iostream>
#include <cstdlib>
using namespace std;
/*
        判断要放置皇后的位置是否合法(与其他皇后不在同一行、同一列、同一斜线上)
    因为nqueen函数是从一行开始向下处理，在第i行放置皇后时，i行及之后还没有进行
    处理，所以在检查时，只用检查到i-1行的列的情况即可,
*/
bool invalid(const int *record, int i, int j)
{
    for (int k = 0; k < i; k++)
    {
        if (j == record[k] || abs(record[k] - j) == abs(k - i))
        {
            return false;
        }
    }
    return true;
}
/*
    i表示目前处理第i行
    record表示皇后目前的拜访情况
    num表示皇后的数量
    返回值为这个数量的皇后在棋盘上所有的拜访方式数量
*/
int process(int i, int *record, int num)
{
    // 处理的目标行超过了棋盘范围,也是递归的返回条件——这一种摆放可行
    if (i == num)
    {
        return 1;
    }
    int res = 0;
    for (int i = 0; i < num; i++)
    {
        for (int j = 0; j < num; j++)
        {
            if (invalid(record, i, j))
            {
                record[i] = j;
                res += process(i + 1, record, num);
            }
        }
    }
    return res;
}
int nqueen(int num)
{
    if (num < 1)
    {
        return -1;
    }
    /*
    record用下标+1记录皇后在第几行，用下标对应的值记录在第几列列，
    例如record[0]=1表示第一行的皇后放在第二列
    */
    int record[num];
    return process(0, record, num);
}
int main()
{
    int num = 0;
    cin >> num;
    int res = nqueen(num);
    cout << res << endl;
    return 0;
}